package Thread_.homework;

public class test11 {
    /**
     * 手写一个死锁代码
     * 提供：可以通过 synchronized 或者 Lock 来实现一个死锁代码。
     * 所谓的死锁就是线程一拥有锁1，线程二拥有锁2，双方在拥有自身锁的同时尝试获取对方的锁，
     * 最终两个线程就会进入无线等待的状态，这就是死锁。
     */
    public static void main(String[] args) {
        Object o1=new Object();
        Object o2=new Object();
        Thread t1=new Thread(){
            @Override
            public void run() {
                synchronized(o1){
                    System.out.println("t1");
                    try {
                        Thread.sleep(1000);//确保t2线程获取锁o2
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized(o2){
                        System.out.println( "t1获取o2锁");
                    }
                }
                System.out.println("t1线程结束");
            }
        };
        Thread t2=new Thread(){
            @Override
            public void run() {
                synchronized(o2){
                    System.out.println("t2");
                    try {
                        Thread.sleep(1000);//确保t1线程获取锁o1
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    synchronized(o1){
                        System.out.println();
                    }
                }
                System.out.println("t2线程结束");

            }
        };
        t1.start();
        t2.start();
    }
}
